-------------------------------------- Chapitre IV - dotNET ---------------------------------------
Analyse de Todd "traditionnelle" avec les outils .Net - 1/3
1) Introduction :
Nous allons étudier la protection d'une application .NET que je qualifierais de niveau 2,5 sur une échelle de 5. Ce cours ne s'adresse donc pas aux débutants, car l'impasse a été faite sur la manipulation des outils et certaines notions élémentaires ne seront pas abordées. On verra que beaucoup d'erreurs ont été commises et qu'il est relativement simple de la cracker et même d'en générer un keygen.
2) Observations :
PEiD en perd son latin, alors que RDG Packer Detector y voit du VB.Net protégé, ce qu'on pourra constater par nos propres yeux sous Reflector.
Cette protection n'étant pas signée, on demande alors à quelques désobfuscateurs de nous donner leur avis... seul
DeDotfuscator semble s'y retrouver et fournir un résultat convenable. Donc notre cible est...
euh était probablement protégée par Dotfuscator !
Notre programme est maintenant désobfusqué et légèrement plus clair car il est plus facile d'assimiler des noms courts/
alphanumériques comme "m000561" plutôt que "#=qxD4no7OLBmabYHhyUKhSdcEBGMLi5gMfENHXkHaj
GFU=".
Concernant les constantes et chaînes de caractères (SDRs), elles sont chiffrées ... il faudra donc s'en passer et admettre qu'elles se cachent
sous la forme "c000052.m000149(-134001454)" où "-134001454" est l'identifiant
(constante) de la chaine masquée.
Pour la suite, seul Reflector sera utile étant donné que l'objectif est d'obtenir un keygen.
3) Analyse :
Comme en programmation, le cracking peut s'aborder d'un millier de façons, mais on verra celle que j'ai choisi après coup comme étant la
plus directe pour notre cible.
Allez savoir pourquoi... l'obfuscation n'est jamais complète et il y a toujours des traces de mots clés. Je cherche "register" et tombe sur
une structure nommée "RegisteredUser" qui comporte 3 propriétés (Name, EMail, RegistrationCode) !
Même si je n'ai pas trouvé le terme "Pour me cracker c'est ici !", ça nous fait déjà un bon début. On demande
à Reflector d'analyser cette structure (Ctrl+R) et on vérifie qui s'en sert (Used By) :
Code :
Là on pourrait tout passer en revue, mais parmi nos résultats, un attire particulièrement mon attention de par sa signature
"(Object, EventArgs)" ! Il s'agit d'une procédure appelée lors d'un click de souris.
Que cache ce "c000027.m000561(Object, EventArgs)" ?
Code :
Bon là aussi c'est évident , le programme vérifie que 3 zones de texte ne soient pas vides... suite au click sur le bouton
"Vérifiez l'enregistrement" !? Pour ceux qui auraient encore des doutes, "c00005e.m00026c()" et "
c00005e.m00026d()" font appel à une msgbox.
Maintenant la condition "if (this.f000318.m000145(this.m000560(), true))", doit-elle être valide ou non ? Quelle est
la bonne msgbox ? On n'a pas de SDRs !
Allons Watson, "this.f000318.m000148" parle de "GNconfig.Save();", alors "
this.f000318.m000145(this.m000560(), true)" doit retourner "true".